package com.agua.enturno.vista.paginas.adm.agendas;

import com.agua.enturno.servicios.AdministradorDeAgendaService;
import com.agua.enturno.servicios.AgendaService;
import com.agua.enturno.vista.BasePage;
import com.agua.enturno.vista.componentes.AgendaChoiceRenderer;
import com.agua.enturno.vista.dto.AgendaDTO;
import com.agua.enturno.vista.dto.DiaNoLaboralDTO;
import com.agua.enturno.vista.dto.JornadaLaboralHabitualDTO;
import com.agua.enturno.vista.dto.JornadaLaboralOcasionalDTO;
import com.agua.enturno.vista.eventos.EliminacionDeJornadaHabitualEvent;
import com.agua.enturno.vista.eventos.EliminacionDeJornadaOcasionalEvent;
import com.agua.enturno.vista.paginas.adm.agendas.horarios.AdministracionDeHorariosPanel;
import com.agua.enturno.vista.util.RolDeUsuario;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
import org.apache.wicket.event.IEvent;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.spring.injection.annot.SpringBean;

import java.util.List;

@AuthorizeInstantiation(RolDeUsuario.ADM_AGENDA)
public class AgendasPage extends BasePage {
	
	private static final long serialVersionUID = 1L;
	
	@SpringBean
	private AdministradorDeAgendaService admAgendaService;
	@SpringBean
	private AgendaService agendaService;
	
	private AgendaDTO agenda;
	private AdministracionDeAgendasPanel administracionDeAgendasPanel;
	private AdministracionDeHorariosPanel admDeHorariosPanel;
	
	@SuppressWarnings("unused")
	private List<JornadaLaboralHabitualDTO> jornadasHabituales;
	@SuppressWarnings("unused")
	private List<JornadaLaboralOcasionalDTO> jornadasOcasionales;
	@SuppressWarnings("unused")
	private List<DiaNoLaboralDTO> diasNoLaborales;


    public AgendasPage() {
    	
    	Long idAdmAgendaDeUsuarioLogueado = getEnTurnoSession().getUsuario().getId(RolDeUsuario.ADM_AGENDA);
    	List<AgendaDTO> agendas = admAgendaService.findAgendas(idAdmAgendaDeUsuarioLogueado);
    	agenda = agendas.get(0);
    	
    	jornadasHabituales = agendaService.findJornadasLaboralesHabituales(agenda.getId());
    	jornadasOcasionales = agendaService.findJornadasLaboralesOcasionales(agenda.getId());
    	diasNoLaborales = agendaService.findDiasNoLaborales(agenda.getId());
    	
        @SuppressWarnings("rawtypes")
		Form form = new Form("select-agenda-form");
        add(form);
    	form.add(new DropDownChoice<AgendaDTO>("agendas", new PropertyModel<AgendaDTO>(this, "agenda"), agendas, new AgendaChoiceRenderer()));
    	form.add(new AjaxButton("cambiar-agenda") {
			
			private static final long serialVersionUID = 1L;

			@Override
			protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
				
				jornadasHabituales = agendaService.findJornadasLaboralesHabituales(agenda.getId());
				jornadasOcasionales = agendaService.findJornadasLaboralesOcasionales(agenda.getId());
				diasNoLaborales = agendaService.findDiasNoLaborales(agenda.getId());
				
				target.add(administracionDeAgendasPanel);
				target.add(admDeHorariosPanel);
			}
			
			@Override
			protected void onError(AjaxRequestTarget target, Form<?> form) {
				target.add(((BasePage)this.getPage()).getFeedbackPanel());
			}
		});
    	    	
    	admDeHorariosPanel = new AdministracionDeHorariosPanel("adm-horarios-panel", new PropertyModel<AgendaDTO>(this, "agenda"));
    	add(admDeHorariosPanel);
    	
    	administracionDeAgendasPanel = new AdministracionDeAgendasPanel("adm-agendas",
    			new PropertyModel<List<JornadaLaboralHabitualDTO>>(this, "jornadasHabituales"), 
    			new PropertyModel<List<JornadaLaboralOcasionalDTO>>(this, "jornadasOcasionales"),
    			new PropertyModel<List<DiaNoLaboralDTO>>(this, "diasNoLaborales"),
    			new PropertyModel<Long>(this, "agenda.id")
    	);
    	add(administracionDeAgendasPanel);
    }
    
	@Override
	public void onEvent(IEvent<?> event) {
		super.onEvent(event);
		
        if (event.getPayload() instanceof EliminacionDeJornadaHabitualEvent) {
        	jornadasHabituales = agendaService.findJornadasLaboralesHabituales(agenda.getId());
        }
        else if (event.getPayload() instanceof EliminacionDeJornadaOcasionalEvent) {
        	jornadasOcasionales = agendaService.findJornadasLaboralesOcasionales(agenda.getId());
        }
	}
    
}
